package jp.co.nes.awssupport.business.utility;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import jp.co.nes.awssupport.common.base.CommonException;
import jp.co.nes.awssupport.common.utility.AppInfoUtil;

/**
 * リージョンユーティリティです。
 */
public class RegionUtil {

    /**
     * デフォルトコンストラクタです。<br>
     * 本クラスはインスタンスを生成しません。
     */
    private RegionUtil() {
    }

    /**
     * リージョン名に対応するリージョンコードを返却します。<br>
     * 引数の値の先頭が、プロパティで定義されているリージョン名と一致するものを探し、
     * 一致したものに対応するリージョンコードを返却します。
     *
     * @param regionName リージョン名
     * @return リージョンコード
     */
    public static String getRegionCode(String regionName) {
        String result = null;
        if (StringUtils.isEmpty(regionName)) {
            throw new CommonException("regionName is null or empty");
        } else {
            // リージョン名とリージョンコードのマッピング情報を取得する。
            Map<String, String> map = AppInfoUtil.getMap("RegionNameCodeMapping");

            // 引数のリージョン名に対応するリージョンコードを取得する。
            Set<Entry<String, String>> entrySet = map.entrySet();
            for (Entry<String, String> entry : entrySet) {
                if (regionName.startsWith(entry.getKey())) {
                    result = entry.getValue();
                    if (StringUtils.isEmpty(result)) {
                        // 誤って空で設定しない限り発生しない。
                        throw new CommonException("regionCode is null or empty(regionName=" + regionName + ")");
                    }
                }
            }
        }
        return result;
    }

    /**
     * リージョンコードリストを返却します。
     *
     * @return リージョンコードリスト
     */
    public static List<String> getRegionCodeList() {
        // リージョン名とリージョンコードのマッピング情報を取得する。
        Map<String, String> map = AppInfoUtil.getMap("RegionNameCodeMapping");

        // リージョンコードリストを作成する。
        List<String> resultList = new ArrayList<>();
        Set<Entry<String, String>> entrySet = map.entrySet();
        for (Entry<String, String> entry : entrySet) {
            resultList.add(entry.getValue());
        }
        return resultList;
    }
}
